package com.vcoud.mundialbrasil2014;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;

import android.database.Cursor;
import android.database.SQLException;
import android.os.AsyncTask;
import android.os.AsyncTask.Status;
import android.os.Bundle;
import android.os.StrictMode;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ExpandableListView;
import android.widget.Toast;

import com.vcoud.mbrasil2014.R;
import com.vcoud.mundialbrasil2014.adapter.PartidosAdapter;

public class FaseGruposFragment extends Fragment {
	List<String> listaGrupo;
	List<String> listaHijo;
	Map<String, ArrayList<HashMap<String, String>>> coleccionGrupo;
	ExpandableListView listaExpandible;
	DB db;
	static final String KEY_PARTIDO_IDPARTIDO = "IDPartido";
	static final String KEY_PARTIDO_FK_EQUIPOLOCAL = "FK_EquipoLocal";
	static final String KEY_PARTIDO_FK_EQUIPOVISITANTE = "FK_EquipoVisitante";
	static final String KEY_PARTIDO_FK_EQUIPOLOCAL_NOMBRE = "FK_EquipoLocal_Nombre";
	static final String KEY_PARTIDO_FK_EQUIPOLOCAL_BANDERA = "FK_EquipoLocal_Bandera";
	static final String KEY_PARTIDO_FK_EQUIPOVISITANTE_NOMBRE = "FK_EquipoVisitante_Nombre";
	static final String KEY_PARTIDO_FK_EQUIPOVISITANTE_BANDERA = "FK_EquipoVisitante_Bandera";
	static final String KEY_PARTIDO_FK_SEDE = "FK_Sede";
	static final String KEY_PARTIDO_FECHA = "Fecha";
	static final String KEY_PARTIDO_NOMBREARBITRO = "NombreArbitro";
	static final String KEY_PARTIDO_GOLLOCAL = "GolLocal";
	static final String KEY_PARTIDO_GOLVISITANTE = "GolVisitante";
	static final String KEY_PARTIDO_GOLLOCALTIEMPOEXTRA = "GolLocalTiempoExtra";
	static final String KEY_PARTIDO_GOLVISITANTETIEMPOEXTRA = "GolVisitanteTiempoExtra";
	static final String KEY_PARTIDO_GOLLOCALPENAL = "GolLocalPenal";
	static final String KEY_PARTIDO_GOLVISITANTEPENAL = "GolVisitantePenal";
	static final String KEY_PARTIDO_FK_ETAPAMUNDIAL = "FK_EtapaMundial";
	int actualPartidos = 0;
	ActualizacionService actualizacion;
	ActualizarSegundoPlano actualizar = new ActualizarSegundoPlano();
	Boolean actualizacionFinalizada = true;

	public FaseGruposFragment() {
	}

	PartidosAdapter faseGruposExpandibleAdapter;

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
				.detectDiskReads().detectDiskWrites().detectNetwork()
				.penaltyLog().build());
		setHasOptionsMenu(true);
		actualizacion = new ActualizacionService(getActivity());
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {

		View rootView = inflater.inflate(R.layout.fragment_fase_grupos,
				container, false);

		crearGrupo();
		crearColeccion();
		listaExpandible = (ExpandableListView) rootView
				.findViewById(R.id.lista_grupo);

		faseGruposExpandibleAdapter = new PartidosAdapter(getActivity(),
				listaGrupo, coleccionGrupo, R.layout.list_fase_grupos,
				R.layout.list_fase_grupos_hijos);

		listaExpandible.setAdapter(faseGruposExpandibleAdapter);
		for (int i = 0; i < listaGrupo.size(); i++) {
			listaExpandible.expandGroup(i);
		}

		listaExpandible
				.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {

					@Override
					public boolean onChildClick(ExpandableListView parent,
							View v, int groupPosition, int childPosition,
							long id) {
						Fragment fragment = null;
						fragment = new DetallePartidoFragment();
						if (fragment != null) {
							// Permite pasar los argumentos a DetallePartido
							Bundle args = new Bundle();
							id = faseGruposExpandibleAdapter.getChildId(
									groupPosition, childPosition);
							args.putLong("IDPartido", id);
							fragment.setArguments(args);
							FragmentManager fragmentManager = getFragmentManager();
							fragmentManager
									.beginTransaction()
									.replace(R.id.fragment_container, fragment,
											"detalle_partido")
									.addToBackStack(getTag()).commit();

						}
						return true;
					}
				});

		listaExpandible.setSelection(listaExpandible
				.getFlatListPosition(ExpandableListView
						.getPackedPositionForGroup(actualPartidos)));

		return rootView;
	}

	private void crearGrupo() {
		listaGrupo = new ArrayList<String>();
		db = new DB(getActivity());
		db.abrir();
		Cursor mCursor = db.obtenerFechasPartidos(0);
		if (mCursor.getCount() > 0 && mCursor.moveToFirst()) {
			do {
				listaGrupo.add(mCursor.getString(0));
			} while (mCursor.moveToNext());
		} else {
			listaGrupo
					.add(getActivity().getString(R.string.verificar_conexion));
		}
		mCursor.close();
		db.cerrar();
	}

	private void crearColeccion() {
		coleccionGrupo = new LinkedHashMap<String, ArrayList<HashMap<String, String>>>();
		db = new DB(getActivity());
		db.abrir();
		int contador = 0;
		for (String grupo : listaGrupo) {
			Cursor mCursor = db.obtenerPartidosPorFecha(grupo);
			ArrayList<HashMap<String, String>> tmpGrupo = new ArrayList<HashMap<String, String>>();

			if (mCursor != null && mCursor.getCount() > 0 && mCursor.moveToFirst()) {
				do {
					HashMap<String, String> mGrupo = new HashMap<String, String>();
					try {
						String horaInicial = mCursor.getString(4);
						String mFechaCompletaString = mCursor.getString(13);
						SimpleDateFormat formatoInicial = new SimpleDateFormat(
								"HH:mm:ss", Locale.US);
						Date mHora = formatoInicial.parse(horaInicial);
						SimpleDateFormat formatoFinal = new SimpleDateFormat(
								"HH:mm", Locale.US);
						String horaFinal = formatoFinal.format(mHora);
						SimpleDateFormat formatoFecha = new SimpleDateFormat(
								"yyyy-MM-dd HH:mm:ss", Locale.US);
						formatoFecha.setTimeZone(TimeZone.getDefault());
						Date mFechaCompleta = formatoFecha
								.parse(mFechaCompletaString);
						Date mFechaHoy = formatoFecha.parse(formatoFecha
								.format(new Date()));
						String mNombreEquipoLocal = null;
						String mNombreEquipoVisitante = null;
						String mBanderaEquipoLocal = null;
						String mBanderaEquipoVisitante = null;
						Cursor equipoLocal = db.obtenerEquipo(mCursor
								.getLong(1));
						Cursor equipoVisitante = db.obtenerEquipo(mCursor
								.getLong(2));
						int mGolesLocal = mCursor.getInt(6) + mCursor.getInt(8);
						int mGolesVisitante = mCursor.getInt(7)	+ mCursor.getInt(9);
						String mResultado = String.valueOf(mGolesLocal)
								+ this.getString(R.string.separador_goles)
								+ String.valueOf(mGolesVisitante);
						if (mFechaHoy.after(mFechaCompleta)) {
							if (mCursor.getInt(10) > 0 || mCursor.getInt(11) > 0){
								horaFinal = mResultado + "(p." + mCursor.getInt(10)
										+ "-" + mCursor.getInt(11) + ")";
							}
							else {
								horaFinal = mResultado;
							}
							actualPartidos = contador;
						}
						mNombreEquipoLocal = equipoLocal.getString(1);
						mBanderaEquipoLocal = equipoLocal.getString(2);
						mNombreEquipoVisitante = equipoVisitante.getString(1);
						mBanderaEquipoVisitante = equipoVisitante.getString(2);
						mGrupo.put(KEY_PARTIDO_IDPARTIDO, mCursor.getString(0));
						mGrupo.put(KEY_PARTIDO_FK_EQUIPOLOCAL_NOMBRE,
								mNombreEquipoLocal);
						mGrupo.put(KEY_PARTIDO_FK_EQUIPOLOCAL_BANDERA,
								mBanderaEquipoLocal);
						mGrupo.put(KEY_PARTIDO_FK_EQUIPOVISITANTE_NOMBRE,
								mNombreEquipoVisitante);
						mGrupo.put(KEY_PARTIDO_FK_EQUIPOVISITANTE_BANDERA,
								mBanderaEquipoVisitante);
						mGrupo.put(KEY_PARTIDO_FK_SEDE, mCursor.getString(3));
						mGrupo.put(KEY_PARTIDO_FECHA, horaFinal);
						mGrupo.put(KEY_PARTIDO_NOMBREARBITRO,
								mCursor.getString(5));
						mGrupo.put(KEY_PARTIDO_GOLLOCAL, mCursor.getString(6));
						mGrupo.put(KEY_PARTIDO_GOLVISITANTE,
								mCursor.getString(7));
						mGrupo.put(KEY_PARTIDO_GOLLOCALTIEMPOEXTRA,
								mCursor.getString(8));
						mGrupo.put(KEY_PARTIDO_GOLVISITANTETIEMPOEXTRA,
								mCursor.getString(9));
						mGrupo.put(KEY_PARTIDO_GOLLOCALPENAL,
								mCursor.getString(10));
						mGrupo.put(KEY_PARTIDO_GOLVISITANTEPENAL,
								mCursor.getString(11));
						mGrupo.put(KEY_PARTIDO_FK_ETAPAMUNDIAL,
								mCursor.getString(12));
						equipoLocal.close();
						equipoVisitante.close();
					} catch (SQLException e) {
						e.printStackTrace();
					} catch (java.text.ParseException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					tmpGrupo.add(mGrupo);
				} while (mCursor.moveToNext());

				coleccionGrupo.put(grupo, tmpGrupo);
			} else {
				HashMap<String, String> mGrupo = new HashMap<String, String>();
				mGrupo.put(KEY_PARTIDO_IDPARTIDO, "0");
				mGrupo.put(KEY_PARTIDO_FK_EQUIPOLOCAL_NOMBRE, "");
				mGrupo.put(KEY_PARTIDO_FK_EQUIPOLOCAL_BANDERA, "");
				mGrupo.put(KEY_PARTIDO_FK_EQUIPOVISITANTE_NOMBRE, "");
				mGrupo.put(KEY_PARTIDO_FK_EQUIPOVISITANTE_BANDERA, "");
				mGrupo.put(KEY_PARTIDO_FECHA,
						getActivity().getString(R.string.inicio_sin_conexion));
				tmpGrupo.add(mGrupo);
				coleccionGrupo.put(grupo, tmpGrupo);
			}
			contador++;
		}
		db.cerrar();
	}

	@Override
	public void onPrepareOptionsMenu(Menu menu) {
		menu.findItem(R.id.action_refresh).setVisible(actualizacionFinalizada);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.action_refresh:
			if (actualizar.getStatus() == Status.FINISHED) {
				actualizar = new ActualizarSegundoPlano();
				actualizar.execute();
			} else if (actualizar.getStatus() == Status.PENDING) {
				actualizar.execute();
			} else {
				Toast.makeText(getActivity().getBaseContext(),
						getString(R.string.inicio_actualizando),
						Toast.LENGTH_SHORT).show();
			}

			return true;
		default:
			return super.onOptionsItemSelected(item);
		}
	}

	private class ActualizarSegundoPlano extends
			AsyncTask<String, Void, Boolean> {

		@Override
		protected void onPreExecute() {
			Log.v("Sync", "Ocurrio el PreExecute");
			getActivity().setProgressBarIndeterminateVisibility(true);
			actualizacionFinalizada = false;
			getActivity().invalidateOptionsMenu();
			Toast.makeText(getActivity().getBaseContext(),
					getString(R.string.inicio_actualizando), Toast.LENGTH_SHORT)
					.show();
		}

		@Override
		protected Boolean doInBackground(String... equipos) {
			Log.v("Sync", "Ocurrio el doInBackground");
			return actualizacion.actualizarPartidosPorEtapa(1);
		}

		@Override
		protected void onPostExecute(Boolean result) {
			Log.v("Sync", "Ocurrio el onPostExecute");
			if (result) {
				crearGrupo();
				crearColeccion();
				faseGruposExpandibleAdapter.actualizar(listaGrupo,
						coleccionGrupo);
				// final FragmentTransaction ft = getSupportFragmentManager()
				// .beginTransaction();
				// Fragment fragment1 = null;
				// Fragment fragment2 = null;
				// fragment1 = getSupportFragmentManager().findFragmentByTag(
				// formarTagFragment(R.id.pager, 0));
				// fragment2 = getSupportFragmentManager().findFragmentByTag(
				// formarTagFragment(R.id.pager, 1));
				// if (fragment1 != null) {
				// ft.detach(fragment1).attach(fragment1);
				// }
				// if (fragment2 != null) {
				// ft.detach(fragment2).attach(fragment2);
				// }
				// ft.commit();

				actualizacionFinalizada = true;
				getActivity().invalidateOptionsMenu();
				getActivity().setProgressBarIndeterminateVisibility(false);
			} else {
				Toast.makeText(getActivity().getBaseContext(),
						getString(R.string.inicio_sin_conexion),
						Toast.LENGTH_SHORT).show();
				actualizacionFinalizada = true;
				getActivity().setProgressBarIndeterminateVisibility(false);
				getActivity().invalidateOptionsMenu();
			}
		}
	}
}
